<HTML><HEAD><META CONTENT="text/html; charset=UTF-8" HTTP-EQUIV="Content-Type"/><TITLE>EMMA Coverage Report</TITLE><STYLE TYPE="text/css"> TABLE,TD,TH {border-style:solid; border-color:black;} TD,TH {background:white;margin:0;line-height:100%;padding-left:0.5em;padding-right:0.5em;} TD {border-width:0 1px 0 0;} TH {border-width:1px 1px 1px 0;} TR TD.h {color:red;} TABLE {border-spacing:0; border-collapse:collapse;border-width:0 0 1px 1px;} P,H1,H2,H3,TH {font-family:verdana,arial,sans-serif;font-size:10pt;} TD {font-family:courier,monospace;font-size:10pt;} TABLE.hdft {border-spacing:0;border-collapse:collapse;border-style:none;} TABLE.hdft TH,TABLE.hdft TD {border-style:none;line-height:normal;} TABLE.hdft TH.tl,TABLE.hdft TD.tl {background:#6699CC;color:white;} TABLE.hdft TD.nv {background:#6633DD;color:white;} .nv A:link {color:white;} .nv A:visited {color:white;} .nv A:active {color:yellow;} TABLE.hdft A:link {color:white;} TABLE.hdft A:visited {color:white;} TABLE.hdft A:active {color:yellow;} .in {color:#356085;} TABLE.s TD {padding-left:0.25em;padding-right:0.25em;} TABLE.s TD.l {padding-left:0.25em;padding-right:0.25em;text-align:right;background:#F0F0F0;} TABLE.s TR.z TD {background:#FF9999;} TABLE.s TR.p TD {background:#FFFF88;} TABLE.s TR.c TD {background:#CCFFCC;} A:link {color:#0000EE;text-decoration:none;} A:visited {color:#0000EE;text-decoration:none;} A:hover {color:#0000EE;text-decoration:underline;} TABLE.cn {border-width:0 0 1px 0;} TABLE.s {border-width:1px 0 1px 1px;} TD.h {color:red;border-width:0 1px 0 0;} TD.f {border-width:0 1px 0 1px;} TD.hf {color:red;border-width:0 1px 0 1px;} TH.f {border-width:1px 1px 1px 1px;} TR.cis TD {background:#F0F0F0;} TR.cis TD {border-width:1px 1px 1px 0;} TR.cis TD.h {color:red;border-width:1px 1px 1px 0;} TR.cis TD.f {border-width:1px 1px 1px 1px;} TR.cis TD.hf {color:red;border-width:1px 1px 1px 1px;} TD.b {border-style:none;background:transparent;line-height:50%;}  TD.bt {border-width:1px 0 0 0;background:transparent;line-height:50%;} TR.o TD {background:#F0F0F0;}TABLE.it {border-style:none;}TABLE.it TD,TABLE.it TH {border-style:none;}</STYLE></HEAD><BODY><TABLE CLASS="hdft" CELLSPACING="0" WIDTH="100%"><TR><TH CLASS="tl"><A HREF="http://www.eclemma.org/">EMMA</A> Coverage Report (generated Thu Dec 17 17:04:35 EST 2009)</TH></TR><TR><TD CLASS="nv">[<A HREF="../Framework-12-17.html">all classes</A>][<A HREF="36.html">ks.common.view</A>]</TD></TR></TABLE><H2>COVERAGE SUMMARY FOR SOURCE FILE [<SPAN CLASS="in">Container.java</SPAN>]</H2><TABLE CELLSPACING="0" WIDTH="100%"><TR><TH>name</TH><TH>class, %</TH><TH>method, %</TH><TH>block, %</TH><TH>line, %</TH></TR><TR><TD>Container.java</TD><TD>100% (2/2)</TD><TD CLASS="h">49%  (26/53)</TD><TD CLASS="h">39%  (334/853)</TD><TD CLASS="h">44%  (102.5/234)</TD></TR></TABLE><H3>COVERAGE BREAKDOWN BY CLASS AND METHOD</H3><TABLE CLASS="cn" CELLSPACING="0" WIDTH="100%"><TR><TH CLASS="f">name</TH><TH>class, %</TH><TH>method, %</TH><TH>block, %</TH><TH>line, %</TH></TR><TR><TD CLASS="b"> </TD><TD CLASS="b"> </TD><TD CLASS="b"> </TD><TD CLASS="b"> </TD><TD CLASS="b"> </TD></TR><TR CLASS="cis"><TD CLASS="f">class <A HREF="#0">Container$1</A></TD><TD>100% (1/1)</TD><TD CLASS="h">50%  (1/2)</TD><TD CLASS="h">5%   (6/114)</TD><TD CLASS="h">8%   (2/26)</TD></TR><TR><TD CLASS="f"><A HREF="#1">checkPermission (Permission): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/108)</TD><TD CLASS="h">0%   (0/24)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#0">Container$1 (Container): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (6/6)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD></TR><TR CLASS="cis"><TD CLASS="f">class <A HREF="#3">Container</A></TD><TD>100% (1/1)</TD><TD CLASS="h">49%  (25/51)</TD><TD CLASS="h">44%  (328/739)</TD><TD CLASS="h">49%  (101.5/209)</TD></TR><TR><TD CLASS="f"><A HREF="#4">forceNextHand (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/17)</TD><TD CLASS="h">0%   (0/6)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#5">getActiveDraggingObject (): Widget</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#6">getBackgroundImage (): RectangleHierarchy</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#7">getCurrentUser (): String</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#8">getDragSource (): Widget</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#9">getDraggingAnchor (): Point</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#a">getGame (): Solitaire</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#b">getLastDrag (): Point</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#c">getModelElements (): Enumeration</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/12)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#d">getWidget (MouseEvent): Widget</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/29)</TD><TD CLASS="h">0%   (0/6)</TD></TR><TR><TD CLASS="f"><A HREF="#e">getWidgets (): Enumeration</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/21)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#f">growWidgets (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/21)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#10">hasWon (): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/19)</TD><TD CLASS="h">0%   (0/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#11">isActive (): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#12">leaveTable (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/7)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#13">processMouseEvent (MouseEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/33)</TD><TD CLASS="h">0%   (0/12)</TD></TR><TR><TD CLASS="f"><A HREF="#14">recalculateBackground (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/47)</TD><TD CLASS="h">0%   (0/10)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#15">refreshWidgets (Rectangle): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/22)</TD><TD CLASS="h">0%   (0/5)</TD></TR><TR><TD CLASS="f"><A HREF="#16">repaintAll (Rectangle): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/22)</TD><TD CLASS="h">0%   (0/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#17">repaintBackground (Rectangle): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/13)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#18">repaintWidgets (Rectangle): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/19)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#19">resetHand (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/11)</TD><TD CLASS="h">0%   (0/5)</TD></TR><TR><TD CLASS="f"><A HREF="#1a">resetSecurity (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/10)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1b">setLastDrag (Point): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/11)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#1c">updateScore (int): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/8)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1d">wonGame (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/9)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#1e">setActiveDraggingObject (Widget, MouseEvent): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">33%  (9/27)</TD><TD CLASS="h">57%  (4/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1f">setVisitor (RectangleHierarchyVisitor): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">55%  (6/11)</TD><TD CLASS="h">75%  (3/4)</TD></TR><TR><TD CLASS="f"><A HREF="#20">setDragSource (Widget): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">67%  (6/9)</TD><TD CLASS="h">75%  (3/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#21">addWidget (Widget): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">70%  (44/63)</TD><TD CLASS="h">75%  (9/12)</TD></TR><TR><TD CLASS="f"><A HREF="#22">intersectsWidget (Rectangle): Widget</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">76%  (22/29)</TD><TD CLASS="h">75%  (4.5/6)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#23">initialize (Solitaire): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>93%  (55/59)</TD><TD>88%  (15/17)</TD></TR><TR><TD CLASS="f"><A HREF="#3">&lt;static initializer&gt;</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (5/5)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#25">Container (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (41/41)</TD><TD>100% (14/14)</TD></TR><TR><TD CLASS="f"><A HREF="#26">getCardImages (): CardImages</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (1/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#27">getNothingBeingDragged (): Widget</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (2/2)</TD><TD>100% (1/1)</TD></TR><TR><TD CLASS="f"><A HREF="#28">getVisitor (): RectangleHierarchyVisitor</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (1/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#29">paint (Graphics): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (16/16)</TD><TD>100% (4/4)</TD></TR><TR><TD CLASS="f"><A HREF="#2a">refreshAll (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (5/5)</TD><TD>100% (3/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2b">refreshWidgets (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (14/14)</TD><TD>100% (3/3)</TD></TR><TR><TD CLASS="f"><A HREF="#2c">releaseDraggingObject (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (14/14)</TD><TD>100% (5/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2d">removeAllWidgets (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (11/11)</TD><TD>100% (4/4)</TD></TR><TR><TD CLASS="f"><A HREF="#2e">repaintAll (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (20/20)</TD><TD>100% (5/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2f">repaintBackground (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (12/12)</TD><TD>100% (3/3)</TD></TR><TR><TD CLASS="f"><A HREF="#30">setActive (boolean): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#31">setCurrentUser (String): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#32">setDraggingAnchor (Point): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#33">setMouseAdapter (MouseAdapter): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (8/8)</TD><TD>100% (3/3)</TD></TR><TR><TD CLASS="f"><A HREF="#34">setMouseMotionAdapter (MouseMotionAdapter): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (8/8)</TD><TD>100% (3/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#35">setUndoAdapter (UndoAdapter): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (8/8)</TD><TD>100% (3/3)</TD></TR><TR><TD CLASS="f"><A HREF="#36">setUpdateStatus (IUpdateStatus): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR></TABLE><P></P><TABLE CLASS="s" CELLSPACING="0" WIDTH="100%"><TR CLASS="c"><TD CLASS="l"><A NAME="0">1</A></TD><TD>package ks.common.view;</TD></TR><TR><TD CLASS="l">2</TD><TD> </TD></TR><TR><TD CLASS="l">3</TD><TD>import java.awt.*;</TD></TR><TR><TD CLASS="l">4</TD><TD>import java.security.Permission;</TD></TR><TR><TD CLASS="l">5</TD><TD> </TD></TR><TR><TD CLASS="l">6</TD><TD>import ks.client.gamefactory.IUpdateStatus;</TD></TR><TR><TD CLASS="l">7</TD><TD>import ks.common.controller.MouseManager;</TD></TR><TR><TD CLASS="l">8</TD><TD>import ks.common.controller.UndoAdapter;</TD></TR><TR><TD CLASS="l">9</TD><TD>import ks.common.games.Solitaire;</TD></TR><TR><TD CLASS="l">10</TD><TD>import ks.common.model.Element;</TD></TR><TR><TD CLASS="l">11</TD><TD>import ks.common.view.CardImages;</TD></TR><TR><TD CLASS="l">12</TD><TD> </TD></TR><TR><TD CLASS="l">13</TD><TD>/**</TD></TR><TR><TD CLASS="l">14</TD><TD> * The container provides the environment within which all Solitaire plug-ins</TD></TR><TR><TD CLASS="l">15</TD><TD> * execute.</TD></TR><TR><TD CLASS="l">16</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">17</TD><TD> * The container is initialized with a Solitaire Plug-in, and manages the interaction</TD></TR><TR><TD CLASS="l">18</TD><TD> * between the user and the game. All mouse events pass through the container, and</TD></TR><TR><TD CLASS="l">19</TD><TD> * are delivered to the appropriate widget based upon the (x,y) point of the mouse</TD></TR><TR><TD CLASS="l">20</TD><TD> * event.</TD></TR><TR><TD CLASS="l">21</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">22</TD><TD> * All Undo requests (right mouse clicks) are first identified by the container, and</TD></TR><TR><TD CLASS="l">23</TD><TD> * are passed along to the solitaire game.</TD></TR><TR><TD CLASS="l">24</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">25</TD><TD> * The container manages any Widgets that are being dragged on the screen. Typically,</TD></TR><TR><TD CLASS="l">26</TD><TD> * these are &lt;code&gt;CardView&lt;/code&gt; widgets, but there is no limitation on this, and</TD></TR><TR><TD CLASS="l">27</TD><TD> * conceivably any widget could be dragged. The container also manages the Widget that</TD></TR><TR><TD CLASS="l">28</TD><TD> * initiated the drag event, called the &lt;code&gt;dragSource&lt;/code&gt;.</TD></TR><TR><TD CLASS="l">29</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">30</TD><TD> * Note: Container must be a java.awt.Component because many of the low-level</TD></TR><TR><TD CLASS="l">31</TD><TD> *       image routines expect an ImageObserver, satisfied by java.awt.Canvas.</TD></TR><TR><TD CLASS="l">32</TD><TD> *       In addition, this class implements key methods enabling events to be</TD></TR><TR><TD CLASS="l">33</TD><TD> *       interpreted and delivered to the Solitaire subclass being viewed.</TD></TR><TR><TD CLASS="l">34</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">35</TD><TD> * Note: Since V1.6, the container also is capable of remembering the source widget </TD></TR><TR><TD CLASS="l">36</TD><TD> *       from which a drag originates, if the Controller invokes &lt;code&gt;setDragSource </TD></TR><TR><TD CLASS="l">37</TD><TD> *       (Widget w)&lt;/code&gt; accordingly. This source widget can then be asked to </TD></TR><TR><TD CLASS="l">38</TD><TD> *       &lt;code&gt;returnWidget(Widget w)&lt;/code&gt; a widget extracted from the source as </TD></TR><TR><TD CLASS="l">39</TD><TD> *       part of the dragging procedure.</TD></TR><TR><TD CLASS="l">40</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">41</TD><TD> * Note: Since V2.2, there is additional logic to enable 'shared state'</TD></TR><TR><TD CLASS="l">42</TD><TD> *       model elements to exist. That is, there is some server-side</TD></TR><TR><TD CLASS="l">43</TD><TD> *       state that stores information about shared state that is only</TD></TR><TR><TD CLASS="l">44</TD><TD> *       accessed</TD></TR><TR><TD CLASS="l">45</TD><TD> * </TD></TR><TR><TD CLASS="l">46</TD><TD> * @author George T. Heineman (heineman@cs.wpi.edu)</TD></TR><TR><TD CLASS="l">47</TD><TD> */</TD></TR><TR CLASS="c"><TD CLASS="l">48</TD><TD> public class Container extends Canvas {</TD></TR><TR><TD CLASS="l">49</TD><TD>        </TD></TR><TR><TD CLASS="l">50</TD><TD>         // If true, then EclEmma can't function...</TD></TR><TR><TD CLASS="l">51</TD><TD>         // make true on deployment!</TD></TR><TR CLASS="c"><TD CLASS="l">52</TD><TD>         private boolean applySecurity = false; </TD></TR><TR><TD CLASS="l">53</TD><TD>         </TD></TR><TR><TD CLASS="l">54</TD><TD>        /**</TD></TR><TR><TD CLASS="l">55</TD><TD>         * Comment for &lt;code&gt;serialVersionUID&lt;/code&gt;</TD></TR><TR><TD CLASS="l">56</TD><TD>         */</TD></TR><TR><TD CLASS="l">57</TD><TD>        private static final long serialVersionUID = 3977859566358640438L;</TD></TR><TR><TD CLASS="l">58</TD><TD> </TD></TR><TR><TD CLASS="l">59</TD><TD>        /** Widgets stored by this container. */</TD></TR><TR><TD CLASS="l">60</TD><TD>        protected Widget[] widgets;</TD></TR><TR><TD CLASS="l">61</TD><TD> </TD></TR><TR><TD CLASS="l">62</TD><TD>        /** number of widgets. */</TD></TR><TR><TD CLASS="l">63</TD><TD>        protected int numWidgets;</TD></TR><TR><TD CLASS="l">64</TD><TD> </TD></TR><TR><TD CLASS="l">65</TD><TD>        /** Growth/initial size of the array */</TD></TR><TR CLASS="c"><TD CLASS="l">66</TD><TD>        protected int potentialSize = 16;</TD></TR><TR><TD CLASS="l">67</TD><TD> </TD></TR><TR><TD CLASS="l">68</TD><TD>        /** The game to be played. */</TD></TR><TR CLASS="c"><TD CLASS="l">69</TD><TD>        protected Solitaire game = null;</TD></TR><TR><TD CLASS="l">70</TD><TD>        </TD></TR><TR><TD CLASS="l">71</TD><TD>        /** Entity to whom information about game is delivered. */</TD></TR><TR><TD CLASS="l">72</TD><TD>        IUpdateStatus status;</TD></TR><TR><TD CLASS="l">73</TD><TD>        </TD></TR><TR><TD CLASS="l">74</TD><TD>        /** Manage an object that is currently being dragged (if at all). */</TD></TR><TR CLASS="c"><TD CLASS="l">75</TD><TD>        protected Widget activeDraggingObject = null;</TD></TR><TR><TD CLASS="l">76</TD><TD> </TD></TR><TR><TD CLASS="l">77</TD><TD>        /** </TD></TR><TR><TD CLASS="l">78</TD><TD>         * The card images used in this container (as specified by the plugin).</TD></TR><TR><TD CLASS="l">79</TD><TD>         * @since V2.1</TD></TR><TR><TD CLASS="l">80</TD><TD>         */</TD></TR><TR CLASS="c"><TD CLASS="l">81</TD><TD>        protected CardImages cards = null;</TD></TR><TR><TD CLASS="l">82</TD><TD>        </TD></TR><TR><TD CLASS="l">83</TD><TD>        /**</TD></TR><TR><TD CLASS="l">84</TD><TD>         * The source widget from which a drag originated.</TD></TR><TR><TD CLASS="l">85</TD><TD>         * @since v1.6</TD></TR><TR><TD CLASS="l"><A NAME="3">86</A></TD><TD>         */</TD></TR><TR CLASS="c"><TD CLASS="l">87</TD><TD>        protected Widget dragSource = null;</TD></TR><TR><TD CLASS="l">88</TD><TD>        </TD></TR><TR><TD CLASS="l">89</TD><TD>        /** A special widget to be used to signal that no object is being dragged. */</TD></TR><TR CLASS="c"><TD CLASS="l">90</TD><TD>        protected static final Widget nothingBeingDragged = new EmptyWidget();</TD></TR><TR><TD CLASS="l">91</TD><TD>        </TD></TR><TR><TD CLASS="l">92</TD><TD>        /** if an entity is being dragged, this point reflects the anchor Point within the widget (useful for ensuring smooth drags). */</TD></TR><TR CLASS="c"><TD CLASS="l">93</TD><TD>        protected java.awt.Point draggingAnchor = null;</TD></TR><TR><TD CLASS="l">94</TD><TD>        </TD></TR><TR><TD CLASS="l">95</TD><TD>        /** Every container must have a mouseManager to coordinate reactions that don't occur in a widget. */</TD></TR><TR CLASS="c"><TD CLASS="l">96</TD><TD>        protected MouseManager mouseManager = new MouseManager (this);</TD></TR><TR><TD CLASS="l">97</TD><TD>        </TD></TR><TR><TD CLASS="l">98</TD><TD>        /** The hierarchy that remembers the background images to be redrawn. */</TD></TR><TR CLASS="c"><TD CLASS="l">99</TD><TD>        protected RectangleHierarchy backgroundImage = null;</TD></TR><TR><TD CLASS="l">100</TD><TD>        </TD></TR><TR><TD CLASS="l">101</TD><TD>        /** Visitor to be used for this container. */</TD></TR><TR><TD CLASS="l">102</TD><TD>        protected RectangleHierarchyVisitor visitor;</TD></TR><TR><TD CLASS="l">103</TD><TD>        </TD></TR><TR><TD CLASS="l">104</TD><TD>        /** What was the point of the last drag. */</TD></TR><TR><TD CLASS="l">105</TD><TD>        protected java.awt.Point lastDrag;</TD></TR><TR><TD CLASS="l">106</TD><TD>        </TD></TR><TR><TD CLASS="l">107</TD><TD>        /** Has a widget told us that a drag is in progress? */</TD></TR><TR><TD CLASS="l">108</TD><TD>        protected boolean dragging;</TD></TR><TR><TD CLASS="l">109</TD><TD>        </TD></TR><TR><TD CLASS="l">110</TD><TD>        /** A Container is active once the game has started. Prior to that all events are disabled. */</TD></TR><TR CLASS="c"><TD CLASS="l">111</TD><TD>        protected boolean active = false;</TD></TR><TR><TD CLASS="l">112</TD><TD>        </TD></TR><TR><TD CLASS="l">113</TD><TD>        /** </TD></TR><TR><TD CLASS="l">114</TD><TD>         * Container knows the name of the current user on which Container is being played.</TD></TR><TR><TD CLASS="l">115</TD><TD>         * @since V2.2  </TD></TR><TR><TD CLASS="l">116</TD><TD>         */</TD></TR><TR><TD CLASS="l">117</TD><TD>        protected String currentUser;</TD></TR><TR><TD CLASS="l">118</TD><TD>        </TD></TR><TR><TD CLASS="l">119</TD><TD>        /** Once a game is in progress, we turn on our security, and save old one. */</TD></TR><TR CLASS="c"><TD CLASS="l">120</TD><TD>        SecurityManager oldSecurity = null;</TD></TR><TR><TD CLASS="l">121</TD><TD>        </TD></TR><TR><TD CLASS="l">122</TD><TD>/**</TD></TR><TR><TD CLASS="l"><A NAME="25">123</A></TD><TD> * Creates an empty container with no widgets.</TD></TR><TR><TD CLASS="l">124</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">125</TD><TD> */</TD></TR><TR><TD CLASS="l">126</TD><TD>public Container() {</TD></TR><TR CLASS="c"><TD CLASS="l">127</TD><TD>        super();</TD></TR><TR><TD CLASS="l">128</TD><TD> </TD></TR><TR><TD CLASS="l">129</TD><TD>        // reuse code to start container afresh.</TD></TR><TR CLASS="c"><TD CLASS="l">130</TD><TD>        removeAllWidgets();</TD></TR><TR CLASS="c"><TD CLASS="l">131</TD><TD>}</TD></TR><TR><TD CLASS="l">132</TD><TD> </TD></TR><TR><TD CLASS="l">133</TD><TD>/**</TD></TR><TR><TD CLASS="l">134</TD><TD> * Tell Container who the current user player is</TD></TR><TR><TD CLASS="l">135</TD><TD> * </TD></TR><TR><TD CLASS="l"><A NAME="31">136</A></TD><TD> * @param user</TD></TR><TR><TD CLASS="l">137</TD><TD> * @since V2.2 to enable multiple solitaire</TD></TR><TR><TD CLASS="l">138</TD><TD> */</TD></TR><TR><TD CLASS="l">139</TD><TD>public void setCurrentUser (String user) {</TD></TR><TR CLASS="c"><TD CLASS="l">140</TD><TD>        currentUser = user;</TD></TR><TR CLASS="c"><TD CLASS="l">141</TD><TD>}</TD></TR><TR><TD CLASS="l">142</TD><TD> </TD></TR><TR><TD CLASS="l">143</TD><TD>/**</TD></TR><TR><TD CLASS="l">144</TD><TD> * Return the current user for this container.</TD></TR><TR><TD CLASS="l"><A NAME="7">145</A></TD><TD> * </TD></TR><TR><TD CLASS="l">146</TD><TD> * @since V2.2 to enable multiple solitaire</TD></TR><TR><TD CLASS="l">147</TD><TD> */</TD></TR><TR><TD CLASS="l">148</TD><TD>public String getCurrentUser() {</TD></TR><TR CLASS="z"><TD CLASS="l">149</TD><TD>        return currentUser;</TD></TR><TR><TD CLASS="l">150</TD><TD>}</TD></TR><TR><TD CLASS="l">151</TD><TD> </TD></TR><TR><TD CLASS="l">152</TD><TD>/**</TD></TR><TR><TD CLASS="l">153</TD><TD> * Adds the widget to the Container.</TD></TR><TR><TD CLASS="l">154</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">155</TD><TD> * This method can only be called after the Container has been initialized. The Widget is added</TD></TR><TR><TD CLASS="l">156</TD><TD> * to the set of widgets, and a MouseManager is assigned, if one is not already in place.</TD></TR><TR><TD CLASS="l">157</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">158</TD><TD> * The Boundary of the Widget is then added to the backgroundImage to maintain the background</TD></TR><TR><TD CLASS="l">159</TD><TD> * real estate that needs its own painting routines.</TD></TR><TR><TD CLASS="l">160</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">161</TD><TD> * If the proposed widget intersects with an existing widget, a message is sent to stderr.</TD></TR><TR><TD CLASS="l">162</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l"><A NAME="21">163</A></TD><TD> * @return boolean true if the widget does not overlap with existing widgets</TD></TR><TR><TD CLASS="l">164</TD><TD> * @param w ks.common.view.Widget</TD></TR><TR><TD CLASS="l">165</TD><TD> */</TD></TR><TR><TD CLASS="l">166</TD><TD>public boolean addWidget(Widget w) {</TD></TR><TR CLASS="c"><TD CLASS="l">167</TD><TD>        Widget ex = intersectsWidget (w.getBounds());</TD></TR><TR CLASS="c"><TD CLASS="l">168</TD><TD>        if (ex != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">169</TD><TD>                System.err.println (&#34;Unable to add widget &#34; + w.getName() + &#34;. It intersects with &#34; + ex.getName());</TD></TR><TR CLASS="z"><TD CLASS="l">170</TD><TD>                return false;</TD></TR><TR><TD CLASS="l">171</TD><TD>        }</TD></TR><TR><TD CLASS="l">172</TD><TD>        </TD></TR><TR><TD CLASS="l">173</TD><TD>        // extend widget array if necessary</TD></TR><TR CLASS="c"><TD CLASS="l">174</TD><TD>        if (numWidgets &gt;= widgets.length) {</TD></TR><TR CLASS="z"><TD CLASS="l">175</TD><TD>                growWidgets();</TD></TR><TR><TD CLASS="l">176</TD><TD>        }</TD></TR><TR><TD CLASS="l">177</TD><TD> </TD></TR><TR><TD CLASS="l">178</TD><TD>        /** Have Widget's peer be this Container and create a MouseManager for it to use (if none in place). */</TD></TR><TR CLASS="c"><TD CLASS="l">179</TD><TD>        w.setContainer (this);</TD></TR><TR CLASS="c"><TD CLASS="l">180</TD><TD>        if (w.getMouseManager() == null)</TD></TR><TR CLASS="c"><TD CLASS="l">181</TD><TD>                w.setMouseManager (new MouseManager (this));</TD></TR><TR><TD CLASS="l">182</TD><TD> </TD></TR><TR><TD CLASS="l">183</TD><TD>        /** Update hierarchy */</TD></TR><TR CLASS="c"><TD CLASS="l">184</TD><TD>        backgroundImage.insert (w.getBounds());</TD></TR><TR><TD CLASS="l">185</TD><TD> </TD></TR><TR><TD CLASS="l">186</TD><TD>        /** Add to our list and return with success. */</TD></TR><TR CLASS="c"><TD CLASS="l">187</TD><TD>        widgets[numWidgets++] = w;</TD></TR><TR CLASS="c"><TD CLASS="l">188</TD><TD>        return true;</TD></TR><TR><TD CLASS="l">189</TD><TD>}</TD></TR><TR><TD CLASS="l">190</TD><TD> </TD></TR><TR><TD CLASS="l">191</TD><TD>/**</TD></TR><TR><TD CLASS="l">192</TD><TD> * Move on to play the next hand for this game. </TD></TR><TR><TD CLASS="l">193</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l"><A NAME="4">194</A></TD><TD> * Note: This is directly invoked by the user and signifies that they have given</TD></TR><TR><TD CLASS="l">195</TD><TD> * up for the given hand. If the user wins, call wonGame() instead.</TD></TR><TR><TD CLASS="l">196</TD><TD> */</TD></TR><TR><TD CLASS="l">197</TD><TD>public void forceNextHand() {</TD></TR><TR CLASS="z"><TD CLASS="l">198</TD><TD>        if (game == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">199</TD><TD>                System.err.println (&#34;Container::forceNextHand() unexpectedly called with empty game.&#34;);</TD></TR><TR CLASS="z"><TD CLASS="l">200</TD><TD>                return;</TD></TR><TR><TD CLASS="l">201</TD><TD>        }</TD></TR><TR><TD CLASS="l">202</TD><TD>        </TD></TR><TR><TD CLASS="l">203</TD><TD>        // pass request onto the game </TD></TR><TR CLASS="z"><TD CLASS="l">204</TD><TD>        game.nextHand();</TD></TR><TR><TD CLASS="l">205</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">206</TD><TD>        if (status != null) { status.incrementNumNewHands(); }</TD></TR><TR CLASS="z"><TD CLASS="l">207</TD><TD>}</TD></TR><TR><TD CLASS="l">208</TD><TD>/**</TD></TR><TR><TD CLASS="l">209</TD><TD> * Returns the object being dragged. If no object is being dragged,</TD></TR><TR><TD CLASS="l">210</TD><TD> * the special &lt;code&gt;getNothingBeingDragged()&lt;code&gt; object is the value</TD></TR><TR><TD CLASS="l">211</TD><TD> * of this method.</TD></TR><TR><TD CLASS="l"><A NAME="5">212</A></TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">213</TD><TD> * @return ks.common.view.Widget</TD></TR><TR><TD CLASS="l">214</TD><TD> */</TD></TR><TR><TD CLASS="l">215</TD><TD>public Widget getActiveDraggingObject() {</TD></TR><TR CLASS="z"><TD CLASS="l">216</TD><TD>        return activeDraggingObject;</TD></TR><TR><TD CLASS="l">217</TD><TD>}</TD></TR><TR><TD CLASS="l">218</TD><TD>/**</TD></TR><TR><TD CLASS="l">219</TD><TD> * Return the background RectangleHierarchy representing the non-widget areas in container.</TD></TR><TR><TD CLASS="l"><A NAME="6">220</A></TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">221</TD><TD> * @return ks.common.view.RectangleHierarchy</TD></TR><TR><TD CLASS="l">222</TD><TD> */</TD></TR><TR><TD CLASS="l">223</TD><TD>public RectangleHierarchy getBackgroundImage() {</TD></TR><TR CLASS="z"><TD CLASS="l">224</TD><TD>        return backgroundImage;</TD></TR><TR><TD CLASS="l">225</TD><TD>}</TD></TR><TR><TD CLASS="l">226</TD><TD>/**</TD></TR><TR><TD CLASS="l">227</TD><TD> * Return the offset within the dragging Widget for where the mouse was initially clicked.</TD></TR><TR><TD CLASS="l"><A NAME="9">228</A></TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">229</TD><TD> * @return Point</TD></TR><TR><TD CLASS="l">230</TD><TD> */</TD></TR><TR><TD CLASS="l">231</TD><TD>public Point getDraggingAnchor() {</TD></TR><TR CLASS="z"><TD CLASS="l">232</TD><TD>        return draggingAnchor;</TD></TR><TR><TD CLASS="l">233</TD><TD>}</TD></TR><TR><TD CLASS="l">234</TD><TD> </TD></TR><TR><TD CLASS="l">235</TD><TD>/**</TD></TR><TR><TD CLASS="l">236</TD><TD> * Gets the source widget from which a drag originated.</TD></TR><TR><TD CLASS="l">237</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">238</TD><TD> * Note: dragSource must be manually set by the controller of the widget since there is</TD></TR><TR><TD CLASS="l">239</TD><TD> * no obvious way for the container to know the object for which the drag originates.</TD></TR><TR><TD CLASS="l">240</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l"><A NAME="8">241</A></TD><TD> * @return ks.common.view.Widget</TD></TR><TR><TD CLASS="l">242</TD><TD> * @since v1.6</TD></TR><TR><TD CLASS="l">243</TD><TD> */</TD></TR><TR><TD CLASS="l">244</TD><TD>public Widget getDragSource() {</TD></TR><TR CLASS="z"><TD CLASS="l">245</TD><TD>        return dragSource;</TD></TR><TR><TD CLASS="l">246</TD><TD>}</TD></TR><TR><TD CLASS="l">247</TD><TD>/**</TD></TR><TR><TD CLASS="l">248</TD><TD> * Returns the last Drag point, or null if no drag is in process.</TD></TR><TR><TD CLASS="l">249</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">250</TD><TD> * This class variable is kept up-to-date by the various MouseManagers</TD></TR><TR><TD CLASS="l">251</TD><TD> * associated with each widget, as well as the MouseManagers with the</TD></TR><TR><TD CLASS="l">252</TD><TD> * Container itself that represents the background.</TD></TR><TR><TD CLASS="l">253</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">254</TD><TD> * If this ever returns null, it means nothing is being dragged.</TD></TR><TR><TD CLASS="l"><A NAME="b">255</A></TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">256</TD><TD> * @return java.awt.Point</TD></TR><TR><TD CLASS="l">257</TD><TD> */</TD></TR><TR><TD CLASS="l">258</TD><TD>public Point getLastDrag() {</TD></TR><TR CLASS="z"><TD CLASS="l">259</TD><TD>        return lastDrag;</TD></TR><TR><TD CLASS="l">260</TD><TD>}</TD></TR><TR><TD CLASS="l">261</TD><TD>/**</TD></TR><TR><TD CLASS="l">262</TD><TD> * Returns a 'sentinel' object that represents the fact that nothing</TD></TR><TR><TD CLASS="l">263</TD><TD> * is being dragged. This avoids the use of using null object references</TD></TR><TR><TD CLASS="l"><A NAME="27">264</A></TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">265</TD><TD> * @return ks.common.view.Widget</TD></TR><TR><TD CLASS="l">266</TD><TD> */</TD></TR><TR><TD CLASS="l">267</TD><TD>public static Widget getNothingBeingDragged() {</TD></TR><TR CLASS="c"><TD CLASS="l">268</TD><TD>        return nothingBeingDragged;</TD></TR><TR><TD CLASS="l">269</TD><TD>}</TD></TR><TR><TD CLASS="l">270</TD><TD> </TD></TR><TR><TD CLASS="l">271</TD><TD>/**</TD></TR><TR><TD CLASS="l">272</TD><TD> * Return visitor being used to draw background skin.</TD></TR><TR><TD CLASS="l"><A NAME="28">273</A></TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">274</TD><TD> * @return ks.common.view.RectangleHierarchyVisitor</TD></TR><TR><TD CLASS="l">275</TD><TD> */</TD></TR><TR><TD CLASS="l">276</TD><TD>public RectangleHierarchyVisitor getVisitor() {</TD></TR><TR CLASS="c"><TD CLASS="l">277</TD><TD>        return visitor;</TD></TR><TR><TD CLASS="l">278</TD><TD>}</TD></TR><TR><TD CLASS="l">279</TD><TD>/**</TD></TR><TR><TD CLASS="l">280</TD><TD> * Return the widget (or null if none exist) that includes given mouse location.</TD></TR><TR><TD CLASS="l">281</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l"><A NAME="d">282</A></TD><TD> * @return ks.common.view.Widget</TD></TR><TR><TD CLASS="l">283</TD><TD> * @param me java.awt.event.MouseEvent</TD></TR><TR><TD CLASS="l">284</TD><TD> */</TD></TR><TR><TD CLASS="l">285</TD><TD>public Widget getWidget(java.awt.event.MouseEvent me) {</TD></TR><TR CLASS="z"><TD CLASS="l">286</TD><TD>        if (me == null) return null;</TD></TR><TR><TD CLASS="l">287</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">288</TD><TD>        Point p = me.getPoint();</TD></TR><TR><TD CLASS="l">289</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">290</TD><TD>        for (int i = 0; i &lt; numWidgets; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">291</TD><TD>                if (widgets[i].inBounds(p)) {</TD></TR><TR CLASS="z"><TD CLASS="l">292</TD><TD>                        return widgets[i];</TD></TR><TR><TD CLASS="l">293</TD><TD>                }</TD></TR><TR><TD CLASS="l">294</TD><TD>        }</TD></TR><TR><TD CLASS="l">295</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">296</TD><TD>        return null;</TD></TR><TR><TD CLASS="l">297</TD><TD>}</TD></TR><TR><TD CLASS="l">298</TD><TD>/**</TD></TR><TR><TD CLASS="l">299</TD><TD> * Return the View Widgets in the container as an Enumeration.</TD></TR><TR><TD CLASS="l"><A NAME="e">300</A></TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">301</TD><TD> * @return java.util.Enumeration</TD></TR><TR><TD CLASS="l">302</TD><TD> */</TD></TR><TR><TD CLASS="l">303</TD><TD>public java.util.Enumeration&lt;Widget&gt; getWidgets() {</TD></TR><TR CLASS="z"><TD CLASS="l">304</TD><TD>        java.util.Vector&lt;Widget&gt; v = new java.util.Vector&lt;Widget&gt;();</TD></TR><TR CLASS="z"><TD CLASS="l">305</TD><TD>        for (int i = 0 ; i &lt; numWidgets; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">306</TD><TD>                v.addElement (widgets[i]);</TD></TR><TR><TD CLASS="l">307</TD><TD>        }</TD></TR><TR><TD CLASS="l">308</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">309</TD><TD>        return v.elements();</TD></TR><TR><TD CLASS="l">310</TD><TD>}</TD></TR><TR><TD CLASS="l"><A NAME="f">311</A></TD><TD>/**</TD></TR><TR><TD CLASS="l">312</TD><TD> * Grow widgets array accordingly.</TD></TR><TR><TD CLASS="l">313</TD><TD> */</TD></TR><TR><TD CLASS="l">314</TD><TD>protected void growWidgets() {</TD></TR><TR CLASS="z"><TD CLASS="l">315</TD><TD>        Widget newWidgets[] = new Widget [widgets.length + potentialSize];</TD></TR><TR CLASS="z"><TD CLASS="l">316</TD><TD>        System.arraycopy (widgets, 0, newWidgets, 0, widgets.length);</TD></TR><TR CLASS="z"><TD CLASS="l">317</TD><TD>        widgets = newWidgets;</TD></TR><TR CLASS="z"><TD CLASS="l">318</TD><TD>}</TD></TR><TR><TD CLASS="l">319</TD><TD>/**</TD></TR><TR><TD CLASS="l">320</TD><TD> * Check with plugin to see if the game has been won.</TD></TR><TR><TD CLASS="l"><A NAME="10">321</A></TD><TD> * @return boolean    whether the solitaire game has been won, according to the</TD></TR><TR><TD CLASS="l">322</TD><TD> *                    game's method &lt;code&gt;hasWon&lt;/code&gt;.</TD></TR><TR><TD CLASS="l">323</TD><TD> */</TD></TR><TR><TD CLASS="l">324</TD><TD>public boolean hasWon() {</TD></TR><TR CLASS="z"><TD CLASS="l">325</TD><TD>        if (game == null) return false;</TD></TR><TR><TD CLASS="l">326</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">327</TD><TD>        boolean rc = game.hasWon();</TD></TR><TR CLASS="z"><TD CLASS="l">328</TD><TD>        if (rc) {</TD></TR><TR CLASS="z"><TD CLASS="l">329</TD><TD>                if (status != null) { status.incrementNumWins(); }</TD></TR><TR><TD CLASS="l">330</TD><TD>        }</TD></TR><TR><TD CLASS="l">331</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">332</TD><TD>        return rc;</TD></TR><TR><TD CLASS="l">333</TD><TD>}</TD></TR><TR><TD CLASS="l">334</TD><TD>/**</TD></TR><TR><TD CLASS="l">335</TD><TD> * Initialize using a Solitaire game that was already constructed elsewhere.</TD></TR><TR><TD CLASS="l">336</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">337</TD><TD> * @since V2.1 this method is responsible for setting the card images in the container</TD></TR><TR><TD CLASS="l">338</TD><TD> * as determined by the given Solitaire plugin</TD></TR><TR><TD CLASS="l">339</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">340</TD><TD> * After this method, the Container is active.</TD></TR><TR><TD CLASS="l">341</TD><TD> * </TD></TR><TR><TD CLASS="l">342</TD><TD> * Since V2.2, we include a security Manager to enforce the</TD></TR><TR><TD CLASS="l">343</TD><TD> * proper behavior of these Solitaire plugins, just to be safe.</TD></TR><TR><TD CLASS="l">344</TD><TD> * </TD></TR><TR><TD CLASS="l">345</TD><TD> * @param myGame   the plugin to be instantiated and activated.</TD></TR><TR><TD CLASS="l">346</TD><TD> */</TD></TR><TR><TD CLASS="l">347</TD><TD>public void initialize(Solitaire myGame) {</TD></TR><TR><TD CLASS="l"><A NAME="23">348</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">349</TD><TD>         * Set hierarchy bounds. Can finally do this because we have been instantiated. Until</TD></TR><TR><TD CLASS="l">350</TD><TD>         * Container is visible, getBounds() will return non-valid results.</TD></TR><TR><TD CLASS="l">351</TD><TD>         */</TD></TR><TR CLASS="c"><TD CLASS="l">352</TD><TD>        backgroundImage = new RectangleHierarchy (getBounds());</TD></TR><TR><TD CLASS="l">353</TD><TD> </TD></TR><TR><TD CLASS="l">354</TD><TD>        // if we have no visitor, instantiate a default BackgroundCopier.</TD></TR><TR CLASS="c"><TD CLASS="l">355</TD><TD>        if (visitor == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">356</TD><TD>                setVisitor (new BackgroundCopier (getGraphics(), getBackground())); </TD></TR><TR><TD CLASS="l">357</TD><TD>        }</TD></TR><TR><TD CLASS="l">358</TD><TD> </TD></TR><TR><TD CLASS="l">359</TD><TD>        // Must remove old widgets because we may be 'rejoined' container (see rejoin table command).</TD></TR><TR CLASS="c"><TD CLASS="l">360</TD><TD>        removeAllWidgets();</TD></TR><TR><TD CLASS="l">361</TD><TD> </TD></TR><TR><TD CLASS="l">362</TD><TD>        // Set the Solitaire context and store the game.</TD></TR><TR CLASS="c"><TD CLASS="l">363</TD><TD>        myGame.setContainer (this);</TD></TR><TR CLASS="c"><TD CLASS="l">364</TD><TD>        this.game = myGame;</TD></TR><TR><TD CLASS="l">365</TD><TD> </TD></TR><TR><TD CLASS="l">366</TD><TD>        // Tell container of the CardImages that are used by the plugin.</TD></TR><TR><TD CLASS="l">367</TD><TD>        // @since V2.1</TD></TR><TR CLASS="c"><TD CLASS="l">368</TD><TD>        cards = myGame.getCardImages();</TD></TR><TR><TD CLASS="l">369</TD><TD>        </TD></TR><TR><TD CLASS="l">370</TD><TD>        // get old security context</TD></TR><TR CLASS="c"><TD CLASS="l">371</TD><TD>        oldSecurity = System.getSecurityManager();</TD></TR><TR><TD CLASS="l">372</TD><TD>        </TD></TR><TR><TD CLASS="l">373</TD><TD>        // install security Manager on this thread. If we can't do so, because we already don't</TD></TR><TR><TD CLASS="l">374</TD><TD>        // have sufficient permissions, we are ok and no need to process this</TD></TR><TR><TD CLASS="l">375</TD><TD>        try {</TD></TR><TR CLASS="c"><TD CLASS="l">376</TD><TD>                SecurityManager ksSecurity = new SecurityManager() {</TD></TR><TR><TD CLASS="l">377</TD><TD>                    /**</TD></TR><TR><TD CLASS="l">378</TD><TD>                     * Throws a &lt;code&gt;SecurityException&lt;/code&gt; if the requested</TD></TR><TR><TD CLASS="l">379</TD><TD>                     * access, specified by the given permission, is not permitted based</TD></TR><TR><TD CLASS="l">380</TD><TD>                     * on the security policy currently in effect.</TD></TR><TR><TD CLASS="l">381</TD><TD>                     * &lt;p&gt;</TD></TR><TR><TD CLASS="l">382</TD><TD>                     * This method calls &lt;code&gt;AccessController.checkPermission&lt;/code&gt; </TD></TR><TR><TD CLASS="l">383</TD><TD>                     * with the given permission.</TD></TR><TR><TD CLASS="l">384</TD><TD>                     *</TD></TR><TR><TD CLASS="l">385</TD><TD>                     * @param     perm   the requested permission.</TD></TR><TR><TD CLASS="l">386</TD><TD>                     * @exception SecurityException if access is not permitted based on</TD></TR><TR><TD CLASS="l">387</TD><TD>                     *                  the current security policy.</TD></TR><TR><TD CLASS="l">388</TD><TD>                     * @exception NullPointerException if the permission argument is</TD></TR><TR><TD CLASS="l"><A NAME="1">389</A></TD><TD>                     *            &lt;code&gt;null&lt;/code&gt;.</TD></TR><TR><TD CLASS="l">390</TD><TD>                     * @since     1.2</TD></TR><TR><TD CLASS="l">391</TD><TD>                     */</TD></TR><TR><TD CLASS="l">392</TD><TD>                    public void checkPermission(Permission perm) {</TD></TR><TR CLASS="z"><TD CLASS="l">393</TD><TD>                            if (perm instanceof AWTPermission) return;</TD></TR><TR><TD CLASS="l">394</TD><TD>                            </TD></TR><TR><TD CLASS="l">395</TD><TD>                            // allow all runtime things to go.</TD></TR><TR CLASS="z"><TD CLASS="l">396</TD><TD>                            if (perm instanceof RuntimePermission) return;</TD></TR><TR><TD CLASS="l">397</TD><TD>                            </TD></TR><TR><TD CLASS="l">398</TD><TD>                            // deny socket transmissions</TD></TR><TR CLASS="z"><TD CLASS="l">399</TD><TD>                            if (perm instanceof java.net.SocketPermission) return;</TD></TR><TR><TD CLASS="l">400</TD><TD>        </TD></TR><TR><TD CLASS="l">401</TD><TD>                            try {</TD></TR><TR><TD CLASS="l">402</TD><TD>                                        // allow property read permission to go</TD></TR><TR CLASS="z"><TD CLASS="l">403</TD><TD>                                        if (perm instanceof java.util.PropertyPermission) {</TD></TR><TR CLASS="z"><TD CLASS="l">404</TD><TD>                                                java.util.PropertyPermission pp = (java.util.PropertyPermission) perm;</TD></TR><TR CLASS="z"><TD CLASS="l">405</TD><TD>                                                if (!pp.getActions().equals (&#34;read&#34;)) {</TD></TR><TR CLASS="z"><TD CLASS="l">406</TD><TD>                                                        throw new SecurityException (&#34;preventing update on:&#34; + pp.getName());</TD></TR><TR><TD CLASS="l">407</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">408</TD><TD>                                                </TD></TR><TR><TD CLASS="l">409</TD><TD>                                                // OK!</TD></TR><TR CLASS="z"><TD CLASS="l">410</TD><TD>                                                return;</TD></TR><TR><TD CLASS="l">411</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">412</TD><TD>                                        </TD></TR><TR CLASS="z"><TD CLASS="l">413</TD><TD>                                        if (perm instanceof java.io.FilePermission) {</TD></TR><TR CLASS="z"><TD CLASS="l">414</TD><TD>                                                java.io.FilePermission fp = (java.io.FilePermission) perm;</TD></TR><TR CLASS="z"><TD CLASS="l">415</TD><TD>                                                if (!fp.getActions().equals(&#34;read&#34;)) {</TD></TR><TR><TD CLASS="l">416</TD><TD>                                                        // allow if within Temp directory</TD></TR><TR CLASS="z"><TD CLASS="l">417</TD><TD>                                                        String tmpDir = System.getProperty(&#34;java.io.tmpdir&#34;);</TD></TR><TR CLASS="z"><TD CLASS="l">418</TD><TD>                                                        if (fp.getName().startsWith(tmpDir)) {</TD></TR><TR CLASS="z"><TD CLASS="l">419</TD><TD>                                                                return;</TD></TR><TR><TD CLASS="l">420</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">421</TD><TD>                                                        </TD></TR><TR><TD CLASS="l">422</TD><TD>                                                        // BAD update attempts!</TD></TR><TR CLASS="z"><TD CLASS="l">423</TD><TD>                                                        throw new SecurityException (&#34;preventing update on:&#34; + fp.getName());</TD></TR><TR><TD CLASS="l">424</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">425</TD><TD>                                                </TD></TR><TR><TD CLASS="l">426</TD><TD>                                                // allow any READ (because we may need .gif or .jpg files).</TD></TR><TR CLASS="z"><TD CLASS="l">427</TD><TD>                                                return;</TD></TR><TR><TD CLASS="l">428</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">429</TD><TD>                                } catch (SecurityException e) {</TD></TR><TR><TD CLASS="l">430</TD><TD>                                        // CAN'T ALLOW THIS TO CONTINUE!</TD></TR><TR CLASS="z"><TD CLASS="l">431</TD><TD>                                    String name = &#34;&#34;;</TD></TR><TR CLASS="z"><TD CLASS="l">432</TD><TD>                                    if (game != null) name = game.getName();</TD></TR><TR CLASS="z"><TD CLASS="l">433</TD><TD>                                    System.err.println (&#34;Bad Behavior by KS Plugin (&#34; + name + &#34;):&#34; + e.getMessage());</TD></TR><TR><TD CLASS="l">434</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">435</TD><TD>                                    leaveTable();</TD></TR><TR CLASS="z"><TD CLASS="l">436</TD><TD>                                    resetSecurity(); // doable within handler?</TD></TR><TR><TD CLASS="l">437</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">438</TD><TD>                                    throw new SecurityException (e.getMessage());</TD></TR><TR><TD CLASS="l">439</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">440</TD><TD>                    }</TD></TR><TR><TD CLASS="l">441</TD><TD>                };</TD></TR><TR CLASS="c"><TD CLASS="l">442</TD><TD>                if (applySecurity) {</TD></TR><TR CLASS="z"><TD CLASS="l">443</TD><TD>                        System.setSecurityManager(ksSecurity);</TD></TR><TR><TD CLASS="l">444</TD><TD>                } else {</TD></TR><TR CLASS="c"><TD CLASS="l">445</TD><TD>                        oldSecurity = null;</TD></TR><TR><TD CLASS="l">446</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">447</TD><TD>        } catch (java.security.AccessControlException ace) {</TD></TR><TR><TD CLASS="l">448</TD><TD>                // just proceed.</TD></TR><TR><TD CLASS="l">449</TD><TD>        }</TD></TR><TR><TD CLASS="l">450</TD><TD>        </TD></TR><TR><TD CLASS="l">451</TD><TD>        // ask Game to initialize itself, then force a refresh.</TD></TR><TR CLASS="c"><TD CLASS="l">452</TD><TD>        game.resetHand();</TD></TR><TR><TD CLASS="l">453</TD><TD>        </TD></TR><TR><TD CLASS="l">454</TD><TD>        // we are now active.</TD></TR><TR CLASS="c"><TD CLASS="l">455</TD><TD>        setActive (true);</TD></TR><TR><TD CLASS="l">456</TD><TD> </TD></TR><TR><TD CLASS="l">457</TD><TD>        // force a refresh...</TD></TR><TR CLASS="c"><TD CLASS="l">458</TD><TD>        repaint();</TD></TR><TR CLASS="c"><TD CLASS="l">459</TD><TD>}</TD></TR><TR><TD CLASS="l">460</TD><TD>/**</TD></TR><TR><TD CLASS="l">461</TD><TD> * Returns the first Widget that intersects the given Rectangle (or null if none exist).</TD></TR><TR><TD CLASS="l">462</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l"><A NAME="22">463</A></TD><TD> * @return ks.common.view.Widget</TD></TR><TR><TD CLASS="l">464</TD><TD> * @param r java.awt.Rectangle</TD></TR><TR><TD CLASS="l">465</TD><TD> */</TD></TR><TR><TD CLASS="l">466</TD><TD>public Widget intersectsWidget(Rectangle r) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="50% line coverage (2 out of 4 instructions)">467</TD><TD TITLE="50% line coverage (2 out of 4 instructions)">        if (r == null) return null;</TD></TR><TR><TD CLASS="l">468</TD><TD>        </TD></TR><TR CLASS="c"><TD CLASS="l">469</TD><TD>        for (int i = 0; i &lt; numWidgets; i++) {</TD></TR><TR><TD CLASS="l">470</TD><TD> </TD></TR><TR><TD CLASS="l">471</TD><TD>                // If we have an intersection, return the widget.</TD></TR><TR CLASS="c"><TD CLASS="l">472</TD><TD>                Rectangle wr = widgets[i].getBounds();</TD></TR><TR CLASS="c"><TD CLASS="l">473</TD><TD>                if (wr.intersects (r)) {</TD></TR><TR CLASS="z"><TD CLASS="l">474</TD><TD>                        return widgets[i];</TD></TR><TR><TD CLASS="l">475</TD><TD>                }</TD></TR><TR><TD CLASS="l">476</TD><TD>        }</TD></TR><TR><TD CLASS="l">477</TD><TD> </TD></TR><TR><TD CLASS="l">478</TD><TD>        // none intersect.</TD></TR><TR CLASS="c"><TD CLASS="l">479</TD><TD>        return null;</TD></TR><TR><TD CLASS="l">480</TD><TD>}</TD></TR><TR><TD CLASS="l">481</TD><TD>/**</TD></TR><TR><TD CLASS="l">482</TD><TD> * Determine whether the Container is active and ready to process events.</TD></TR><TR><TD CLASS="l">483</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">484</TD><TD> * Note: When a container is active, all mouse events are processed.</TD></TR><TR><TD CLASS="l"><A NAME="11">485</A></TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">486</TD><TD> * @return boolean</TD></TR><TR><TD CLASS="l">487</TD><TD> */</TD></TR><TR><TD CLASS="l">488</TD><TD>public boolean isActive() {</TD></TR><TR CLASS="z"><TD CLASS="l">489</TD><TD>        return active;</TD></TR><TR><TD CLASS="l">490</TD><TD>}</TD></TR><TR><TD CLASS="l">491</TD><TD>/**</TD></TR><TR><TD CLASS="l">492</TD><TD> * When a player wishes to leave the entire table. Note that the GUI has</TD></TR><TR><TD CLASS="l"><A NAME="12">493</A></TD><TD> * already confirmed this with the user so we must now carry out the action.</TD></TR><TR><TD CLASS="l">494</TD><TD> */</TD></TR><TR><TD CLASS="l">495</TD><TD>public void leaveTable() {</TD></TR><TR><TD CLASS="l">496</TD><TD>        // release any resources we have.</TD></TR><TR CLASS="z"><TD CLASS="l">497</TD><TD>        visitor.setVisible (false);   // check out interface for reasons.</TD></TR><TR><TD CLASS="l">498</TD><TD>        </TD></TR><TR><TD CLASS="l">499</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">500</TD><TD>        resetSecurity();</TD></TR><TR CLASS="z"><TD CLASS="l">501</TD><TD>}</TD></TR><TR><TD CLASS="l"><A NAME="1a">502</A></TD><TD>/**</TD></TR><TR><TD CLASS="l">503</TD><TD> * Go back to original security manager.</TD></TR><TR><TD CLASS="l">504</TD><TD> */</TD></TR><TR><TD CLASS="l">505</TD><TD>void resetSecurity() {</TD></TR><TR CLASS="z"><TD CLASS="l">506</TD><TD>        if (oldSecurity != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">507</TD><TD>                System.setSecurityManager(oldSecurity);</TD></TR><TR CLASS="z"><TD CLASS="l">508</TD><TD>                oldSecurity = null;</TD></TR><TR><TD CLASS="l">509</TD><TD>        }</TD></TR><TR CLASS="z"><TD CLASS="l">510</TD><TD>}</TD></TR><TR><TD CLASS="l">511</TD><TD> </TD></TR><TR><TD CLASS="l">512</TD><TD>/**</TD></TR><TR><TD CLASS="l">513</TD><TD> * Force all model elements to be redrawn. Since this method is used by low-level</TD></TR><TR><TD CLASS="l">514</TD><TD> * java.awt.* code, we must adhere to the semantics of paint(). Thus, all elements</TD></TR><TR><TD CLASS="l">515</TD><TD> * are redrawn (including the background)</TD></TR><TR><TD CLASS="l">516</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">517</TD><TD> * Paint is an imperative command that forces the Container to draw itself.</TD></TR><TR><TD CLASS="l">518</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">519</TD><TD> * The dragging of objects is managed separately.</TD></TR><TR><TD CLASS="l">520</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">521</TD><TD> * @param g java.awt.Graphics</TD></TR><TR><TD CLASS="l"><A NAME="29">522</A></TD><TD> */</TD></TR><TR><TD CLASS="l">523</TD><TD>public void paint(java.awt.Graphics g) {</TD></TR><TR><TD CLASS="l">524</TD><TD> </TD></TR><TR><TD CLASS="l">525</TD><TD>        // visitor for background already has graphics object.</TD></TR><TR CLASS="c"><TD CLASS="l">526</TD><TD>        repaintBackground();</TD></TR><TR><TD CLASS="l">527</TD><TD> </TD></TR><TR><TD CLASS="l">528</TD><TD>        // update those views that need refreshing.</TD></TR><TR CLASS="c"><TD CLASS="l">529</TD><TD>        for (int i = 0 ; i &lt; numWidgets; i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">530</TD><TD>                widgets[i].paint();</TD></TR><TR><TD CLASS="l">531</TD><TD>        }</TD></TR><TR CLASS="c"><TD CLASS="l">532</TD><TD>}</TD></TR><TR><TD CLASS="l">533</TD><TD> </TD></TR><TR><TD CLASS="l">534</TD><TD>/**</TD></TR><TR><TD CLASS="l">535</TD><TD> * Container must send this mouse event to the appropriate controller</TD></TR><TR><TD CLASS="l">536</TD><TD> * for processing.</TD></TR><TR><TD CLASS="l">537</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">538</TD><TD> * If the container is inactive, no action is taken. The following mouse events can</TD></TR><TR><TD CLASS="l">539</TD><TD> * be global and do not apply to a specific Widget (not even handled yet):</TD></TR><TR><TD CLASS="l">540</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">541</TD><TD> *    MouseExited&lt;br&gt;</TD></TR><TR><TD CLASS="l">542</TD><TD> *    MouseEntered&lt;br&gt;</TD></TR><TR><TD CLASS="l">543</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">544</TD><TD> * @param me java.awt.event.MouseEvent</TD></TR><TR><TD CLASS="l">545</TD><TD> */</TD></TR><TR><TD CLASS="l">546</TD><TD>public void processMouseEvent(java.awt.event.MouseEvent me) {</TD></TR><TR><TD CLASS="l">547</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="13">548</A></TD><TD>        // Perhaps allow mouseEntered/mouseExited to be dealt with here (especially with regards to</TD></TR><TR><TD CLASS="l">549</TD><TD>        // setting the cursor to a WAIT cursor if the game hasn't started...)</TD></TR><TR><TD CLASS="l">550</TD><TD> </TD></TR><TR><TD CLASS="l">551</TD><TD>        // do nothing if we are inactive.</TD></TR><TR CLASS="z"><TD CLASS="l">552</TD><TD>        if (isActive() == false) {</TD></TR><TR CLASS="z"><TD CLASS="l">553</TD><TD>                return;</TD></TR><TR><TD CLASS="l">554</TD><TD>        }</TD></TR><TR><TD CLASS="l">555</TD><TD>        </TD></TR><TR><TD CLASS="l">556</TD><TD>        // Find the widget who should get event (or return if none found).</TD></TR><TR CLASS="z"><TD CLASS="l">557</TD><TD>        Widget w = getWidget (me);</TD></TR><TR CLASS="z"><TD CLASS="l">558</TD><TD>        if (w == null) {</TD></TR><TR><TD CLASS="l">559</TD><TD>                // even if no widget gets the mouse event, it may still be needed (for example, if released</TD></TR><TR><TD CLASS="l">560</TD><TD>                // over the container, or during drag events. </TD></TR><TR CLASS="z"><TD CLASS="l">561</TD><TD>                mouseManager.handleMouseEvent (me);</TD></TR><TR><TD CLASS="l">562</TD><TD>        } else {</TD></TR><TR><TD CLASS="l">563</TD><TD>                // get the controller</TD></TR><TR CLASS="z"><TD CLASS="l">564</TD><TD>                MouseManager mm = w.getMouseManager();</TD></TR><TR CLASS="z"><TD CLASS="l">565</TD><TD>                if (mm == null) return;</TD></TR><TR><TD CLASS="l">566</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">567</TD><TD>                mm.handleMouseEvent(me);</TD></TR><TR><TD CLASS="l">568</TD><TD>        }</TD></TR><TR><TD CLASS="l">569</TD><TD> </TD></TR><TR><TD CLASS="l">570</TD><TD>        // Will this be invoked too many times? Limit to BIG THREE.</TD></TR><TR CLASS="z"><TD CLASS="l">571</TD><TD>        switch(me.getID()) {</TD></TR><TR><TD CLASS="l">572</TD><TD>                case java.awt.event.MouseEvent.MOUSE_PRESSED:</TD></TR><TR><TD CLASS="l">573</TD><TD>                case java.awt.event.MouseEvent.MOUSE_RELEASED:</TD></TR><TR><TD CLASS="l">574</TD><TD>                case java.awt.event.MouseEvent.MOUSE_CLICKED:</TD></TR><TR CLASS="z"><TD CLASS="l">575</TD><TD>                        if (hasWon()) {</TD></TR><TR CLASS="z"><TD CLASS="l">576</TD><TD>                                wonGame();</TD></TR><TR><TD CLASS="l">577</TD><TD>                }</TD></TR><TR><TD CLASS="l">578</TD><TD>        }</TD></TR><TR CLASS="z"><TD CLASS="l">579</TD><TD>}</TD></TR><TR><TD CLASS="l">580</TD><TD>/**</TD></TR><TR><TD CLASS="l">581</TD><TD> * If container is resized, or its bounds are otherwise manipulated, this method recalculates</TD></TR><TR><TD CLASS="l"><A NAME="14">582</A></TD><TD> * the background RectangleHierarchy.</TD></TR><TR><TD CLASS="l">583</TD><TD> */</TD></TR><TR><TD CLASS="l">584</TD><TD>public void recalculateBackground() {</TD></TR><TR><TD CLASS="l">585</TD><TD>        // Set hierarchy bounds.</TD></TR><TR CLASS="z"><TD CLASS="l">586</TD><TD>        backgroundImage = new RectangleHierarchy (getBounds());</TD></TR><TR><TD CLASS="l">587</TD><TD> </TD></TR><TR><TD CLASS="l">588</TD><TD>        // if we have no visitor, instantiate a default BackgroundCopier.</TD></TR><TR CLASS="z"><TD CLASS="l">589</TD><TD>        if (visitor == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">590</TD><TD>                setVisitor (new BackgroundCopier (getGraphics(), getBackground()));</TD></TR><TR><TD CLASS="l">591</TD><TD>        }</TD></TR><TR><TD CLASS="l">592</TD><TD> </TD></TR><TR><TD CLASS="l">593</TD><TD>        // hold onto copy, because these will be added back in one-at-a-time.</TD></TR><TR CLASS="z"><TD CLASS="l">594</TD><TD>        Widget copy[] = widgets;</TD></TR><TR><TD CLASS="l">595</TD><TD>        </TD></TR><TR><TD CLASS="l">596</TD><TD>        // Must remove old widgets because we may be 'rejoined' container (see rejoin table command).</TD></TR><TR CLASS="z"><TD CLASS="l">597</TD><TD>        removeAllWidgets();</TD></TR><TR><TD CLASS="l">598</TD><TD> </TD></TR><TR><TD CLASS="l">599</TD><TD>        // now add back in, with the new boundaries        </TD></TR><TR CLASS="z"><TD CLASS="l">600</TD><TD>        for (int i = 0; i &lt; copy.length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">601</TD><TD>                if (copy[i] != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">602</TD><TD>                        addWidget (copy[i]);</TD></TR><TR CLASS="z"><TD CLASS="l">603</TD><TD>                        copy[i] = null;</TD></TR><TR><TD CLASS="l">604</TD><TD>                }</TD></TR><TR><TD CLASS="l">605</TD><TD>        }</TD></TR><TR CLASS="z"><TD CLASS="l">606</TD><TD>}</TD></TR><TR><TD CLASS="l">607</TD><TD>/**</TD></TR><TR><TD CLASS="l"><A NAME="2a">608</A></TD><TD> * Refresh widgets in container. Note that this updates the background but only</TD></TR><TR><TD CLASS="l">609</TD><TD> * refreshes the widgets that have been marked as 'dirty'.</TD></TR><TR><TD CLASS="l">610</TD><TD> */</TD></TR><TR><TD CLASS="l">611</TD><TD>public void refreshAll() {</TD></TR><TR CLASS="c"><TD CLASS="l">612</TD><TD>        repaintBackground();</TD></TR><TR CLASS="c"><TD CLASS="l">613</TD><TD>        refreshWidgets();</TD></TR><TR CLASS="c"><TD CLASS="l">614</TD><TD>}</TD></TR><TR><TD CLASS="l">615</TD><TD>/**</TD></TR><TR><TD CLASS="l"><A NAME="2b">616</A></TD><TD> * Refresh widgets in container. This only refreshes the widgets that have been marked 'dirty'</TD></TR><TR><TD CLASS="l">617</TD><TD> */</TD></TR><TR><TD CLASS="l">618</TD><TD>public void refreshWidgets() {</TD></TR><TR><TD CLASS="l">619</TD><TD>        // update those views that need refreshing.</TD></TR><TR CLASS="c"><TD CLASS="l">620</TD><TD>        for (int i = 0 ; i &lt; numWidgets; i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">621</TD><TD>                widgets[i].refresh();</TD></TR><TR><TD CLASS="l">622</TD><TD>        }</TD></TR><TR CLASS="c"><TD CLASS="l">623</TD><TD>}</TD></TR><TR><TD CLASS="l">624</TD><TD>/**</TD></TR><TR><TD CLASS="l">625</TD><TD> * Refresh widgets in container. This only refreshes the widgets that are marked 'dirty'.</TD></TR><TR><TD CLASS="l">626</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">627</TD><TD> * Clip to the specified rectangle. Clip is unaffected by this method.</TD></TR><TR><TD CLASS="l">628</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l"><A NAME="15">629</A></TD><TD> * @param clip java.awt.Rectangle</TD></TR><TR><TD CLASS="l">630</TD><TD> */</TD></TR><TR><TD CLASS="l">631</TD><TD>public void refreshWidgets(Rectangle clip) {</TD></TR><TR><TD CLASS="l">632</TD><TD>        // empty, so return</TD></TR><TR CLASS="z"><TD CLASS="l">633</TD><TD>        if (clip == null) return;</TD></TR><TR CLASS="z"><TD CLASS="l">634</TD><TD>        if (clip.isEmpty ()) return;</TD></TR><TR><TD CLASS="l">635</TD><TD>        </TD></TR><TR><TD CLASS="l">636</TD><TD>        // update those views that need refreshing.</TD></TR><TR CLASS="z"><TD CLASS="l">637</TD><TD>        for (int i = 0 ; i &lt; numWidgets; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">638</TD><TD>                widgets[i].refresh(clip);</TD></TR><TR><TD CLASS="l">639</TD><TD>        }</TD></TR><TR CLASS="z"><TD CLASS="l">640</TD><TD>}</TD></TR><TR><TD CLASS="l">641</TD><TD>/**</TD></TR><TR><TD CLASS="l">642</TD><TD> * Releases the object being dragged by the container.</TD></TR><TR><TD CLASS="l">643</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l"><A NAME="2c">644</A></TD><TD> * Note: this will also reset the dragSource and lastDrag to null.</TD></TR><TR><TD CLASS="l">645</TD><TD> */</TD></TR><TR><TD CLASS="l">646</TD><TD>public void releaseDraggingObject() {</TD></TR><TR><TD CLASS="l">647</TD><TD>        // release dragging Object.</TD></TR><TR CLASS="c"><TD CLASS="l">648</TD><TD>        setActiveDraggingObject (getNothingBeingDragged(), null);</TD></TR><TR><TD CLASS="l">649</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">650</TD><TD>        dragging = false;</TD></TR><TR CLASS="c"><TD CLASS="l">651</TD><TD>        lastDrag = null;</TD></TR><TR><TD CLASS="l">652</TD><TD> </TD></TR><TR><TD CLASS="l">653</TD><TD>        // reset our sourceWidget (if it was ever set in the first place).</TD></TR><TR CLASS="c"><TD CLASS="l">654</TD><TD>        dragSource = null;</TD></TR><TR CLASS="c"><TD CLASS="l">655</TD><TD>}</TD></TR><TR><TD CLASS="l">656</TD><TD>/**</TD></TR><TR><TD CLASS="l">657</TD><TD> * Remove all widgets from this container to start fresh.</TD></TR><TR><TD CLASS="l"><A NAME="2d">658</A></TD><TD> */</TD></TR><TR><TD CLASS="l">659</TD><TD>public void removeAllWidgets() {</TD></TR><TR><TD CLASS="l">660</TD><TD> </TD></TR><TR><TD CLASS="l">661</TD><TD>        /** Initialize this container to have no widgets. */</TD></TR><TR CLASS="c"><TD CLASS="l">662</TD><TD>        widgets = new Widget [potentialSize];</TD></TR><TR CLASS="c"><TD CLASS="l">663</TD><TD>        numWidgets = 0;</TD></TR><TR><TD CLASS="l">664</TD><TD>        </TD></TR><TR><TD CLASS="l">665</TD><TD>        /** At the outset, nothing is being dragged. */</TD></TR><TR CLASS="c"><TD CLASS="l">666</TD><TD>        releaseDraggingObject();        </TD></TR><TR CLASS="c"><TD CLASS="l">667</TD><TD>}</TD></TR><TR><TD CLASS="l">668</TD><TD>/**</TD></TR><TR><TD CLASS="l">669</TD><TD> * Force a repaint of all Widgets, whether they are dirty or not.</TD></TR><TR><TD CLASS="l">670</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l"><A NAME="2e">671</A></TD><TD> * This method repaints background also.</TD></TR><TR><TD CLASS="l">672</TD><TD> */</TD></TR><TR><TD CLASS="l">673</TD><TD>public void repaintAll() {</TD></TR><TR><TD CLASS="l">674</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">675</TD><TD>        repaintBackground();</TD></TR><TR><TD CLASS="l">676</TD><TD>        </TD></TR><TR CLASS="c"><TD CLASS="l">677</TD><TD>        Graphics g = getGraphics();</TD></TR><TR CLASS="c"><TD CLASS="l">678</TD><TD>        for (int i = 0; i &lt; numWidgets; i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">679</TD><TD>                widgets[i].paint(g);</TD></TR><TR><TD CLASS="l">680</TD><TD>        }</TD></TR><TR CLASS="c"><TD CLASS="l">681</TD><TD>}</TD></TR><TR><TD CLASS="l">682</TD><TD>/**</TD></TR><TR><TD CLASS="l">683</TD><TD> * Force a repaint of all Widgets, whether they are dirty or not. Also draw background.</TD></TR><TR><TD CLASS="l">684</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">685</TD><TD> * Restrict drawing to the clip rectangle. [clip is unaffected by this invocation.]</TD></TR><TR><TD CLASS="l">686</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">687</TD><TD> * This method avoids the default fillRect over the whole background (which flickers the screen).</TD></TR><TR><TD CLASS="l">688</TD><TD> * @param clip java.awt.Rectangle</TD></TR><TR><TD CLASS="l"><A NAME="16">689</A></TD><TD> */</TD></TR><TR><TD CLASS="l">690</TD><TD>public void repaintAll(Rectangle clip) {</TD></TR><TR><TD CLASS="l">691</TD><TD> </TD></TR><TR><TD CLASS="l">692</TD><TD>        // redraw the background</TD></TR><TR CLASS="z"><TD CLASS="l">693</TD><TD>        repaintBackground(clip);</TD></TR><TR><TD CLASS="l">694</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">695</TD><TD>        Graphics g = getGraphics();</TD></TR><TR CLASS="z"><TD CLASS="l">696</TD><TD>        for (int i = 0; i &lt; numWidgets; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">697</TD><TD>                widgets[i].paint(g, clip);</TD></TR><TR><TD CLASS="l">698</TD><TD>        }</TD></TR><TR CLASS="z"><TD CLASS="l">699</TD><TD>}</TD></TR><TR><TD CLASS="l">700</TD><TD>/**</TD></TR><TR><TD CLASS="l">701</TD><TD> * Refresh the background screen which is a hierarchy of rectangles to be filled using background image.</TD></TR><TR><TD CLASS="l"><A NAME="2f">702</A></TD><TD> */</TD></TR><TR><TD CLASS="l">703</TD><TD>public void repaintBackground() {</TD></TR><TR><TD CLASS="l">704</TD><TD>        </TD></TR><TR><TD CLASS="l">705</TD><TD>        // Traverse the tree and have visitor update everything.</TD></TR><TR CLASS="c"><TD CLASS="l">706</TD><TD>        if (visitor != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">707</TD><TD>                if (backgroundImage != null) backgroundImage.accept (visitor);</TD></TR><TR><TD CLASS="l">708</TD><TD>        }</TD></TR><TR CLASS="c"><TD CLASS="l">709</TD><TD>}</TD></TR><TR><TD CLASS="l">710</TD><TD>/**</TD></TR><TR><TD CLASS="l">711</TD><TD> * Refresh the background screen which is a hierarchy of rectangles to be filled using background image.</TD></TR><TR><TD CLASS="l">712</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">713</TD><TD> * Restrict to the clip Rectangular region. [clip is unaffected by this invocation.]</TD></TR><TR><TD CLASS="l">714</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">715</TD><TD> * @param clip java.awt.Rectangle </TD></TR><TR><TD CLASS="l"><A NAME="17">716</A></TD><TD> */</TD></TR><TR><TD CLASS="l">717</TD><TD>public void repaintBackground (Rectangle clip) {</TD></TR><TR><TD CLASS="l">718</TD><TD>        </TD></TR><TR><TD CLASS="l">719</TD><TD>        // Traverse the tree and have visitor update everything.</TD></TR><TR CLASS="z"><TD CLASS="l">720</TD><TD>        if (visitor != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">721</TD><TD>                if (backgroundImage != null) backgroundImage.accept (visitor, clip);</TD></TR><TR><TD CLASS="l">722</TD><TD>        }</TD></TR><TR CLASS="z"><TD CLASS="l">723</TD><TD>}</TD></TR><TR><TD CLASS="l">724</TD><TD>/**</TD></TR><TR><TD CLASS="l">725</TD><TD> * Force a repaint of all Widgets that intersect given clip region, whether they are </TD></TR><TR><TD CLASS="l">726</TD><TD> * dirty or not.</TD></TR><TR><TD CLASS="l">727</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">728</TD><TD> * Restrict drawing to the clip rectangle [clip is unaffected].</TD></TR><TR><TD CLASS="l">729</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">730</TD><TD> * This method avoids the default fillRect over the whole background (which flickers the screen).</TD></TR><TR><TD CLASS="l"><A NAME="18">731</A></TD><TD> * @param clip java.awt.Rectangle</TD></TR><TR><TD CLASS="l">732</TD><TD> */</TD></TR><TR><TD CLASS="l">733</TD><TD>public void repaintWidgets(Rectangle clip) {</TD></TR><TR><TD CLASS="l">734</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">735</TD><TD>        Graphics g = getGraphics();</TD></TR><TR CLASS="z"><TD CLASS="l">736</TD><TD>        for (int i = 0; i &lt; numWidgets; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">737</TD><TD>                widgets[i].paint(g, clip);</TD></TR><TR><TD CLASS="l">738</TD><TD>        }</TD></TR><TR CLASS="z"><TD CLASS="l">739</TD><TD>}</TD></TR><TR><TD CLASS="l"><A NAME="19">740</A></TD><TD>/**</TD></TR><TR><TD CLASS="l">741</TD><TD> * Reset existing game to redeal cards exactly as it was started.</TD></TR><TR><TD CLASS="l">742</TD><TD> */</TD></TR><TR><TD CLASS="l">743</TD><TD>public void resetHand() {</TD></TR><TR CLASS="z"><TD CLASS="l">744</TD><TD>        if (game == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">745</TD><TD>                System.err.println (&#34;Container::resetHand() unexpectedly called with empty game.&#34;);</TD></TR><TR CLASS="z"><TD CLASS="l">746</TD><TD>                return;</TD></TR><TR><TD CLASS="l">747</TD><TD>        }</TD></TR><TR><TD CLASS="l">748</TD><TD> </TD></TR><TR><TD CLASS="l">749</TD><TD>        // pass request onto the game </TD></TR><TR CLASS="z"><TD CLASS="l">750</TD><TD>        game.resetHand();</TD></TR><TR CLASS="z"><TD CLASS="l">751</TD><TD>}</TD></TR><TR><TD CLASS="l">752</TD><TD> </TD></TR><TR><TD CLASS="l">753</TD><TD>/**</TD></TR><TR><TD CLASS="l"><A NAME="30">754</A></TD><TD> * Activate the container (or deactivate it) to be able to process events.</TD></TR><TR><TD CLASS="l">755</TD><TD> * @param newActive boolean</TD></TR><TR><TD CLASS="l">756</TD><TD> */</TD></TR><TR><TD CLASS="l">757</TD><TD>public void setActive(boolean newActive) {</TD></TR><TR CLASS="c"><TD CLASS="l">758</TD><TD>        active = newActive;</TD></TR><TR CLASS="c"><TD CLASS="l">759</TD><TD>}</TD></TR><TR><TD CLASS="l">760</TD><TD>/**</TD></TR><TR><TD CLASS="l">761</TD><TD> * Specifies the Widget being dragged. Note: this is called once. Thereafter, for each</TD></TR><TR><TD CLASS="l">762</TD><TD> * drag event, MouseManagers for the Widgets update the lastDrag Point in the container.</TD></TR><TR><TD CLASS="l">763</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">764</TD><TD> * We also take as input the MouseEvent associated with this dragging object; this enables</TD></TR><TR><TD CLASS="l">765</TD><TD> * us to calculate the anchor.</TD></TR><TR><TD CLASS="l">766</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">767</TD><TD> * Take some care if MouseEvent is null.</TD></TR><TR><TD CLASS="l"><A NAME="1e">768</A></TD><TD> * @param newActiveDraggingObject ks.common.view.Widget</TD></TR><TR><TD CLASS="l">769</TD><TD> * @param me MouseEvent</TD></TR><TR><TD CLASS="l">770</TD><TD> */</TD></TR><TR><TD CLASS="l">771</TD><TD>public void setActiveDraggingObject(Widget newActiveDraggingObject, java.awt.event.MouseEvent me) {</TD></TR><TR CLASS="c"><TD CLASS="l">772</TD><TD>        activeDraggingObject = newActiveDraggingObject;</TD></TR><TR><TD CLASS="l">773</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">774</TD><TD>        if (me == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">775</TD><TD>                setDraggingAnchor (null);</TD></TR><TR CLASS="c"><TD CLASS="l">776</TD><TD>                return;</TD></TR><TR><TD CLASS="l">777</TD><TD>        }</TD></TR><TR><TD CLASS="l">778</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">779</TD><TD>        Point p = new Point (me.getX() - newActiveDraggingObject.getX(), me.getY() - newActiveDraggingObject.getY());</TD></TR><TR CLASS="z"><TD CLASS="l">780</TD><TD>        setDraggingAnchor (p);</TD></TR><TR CLASS="z"><TD CLASS="l">781</TD><TD>}</TD></TR><TR><TD CLASS="l">782</TD><TD>/**</TD></TR><TR><TD CLASS="l">783</TD><TD> * Record DraggingAnchor, the offset within the dragged widget of where the </TD></TR><TR><TD CLASS="l">784</TD><TD> * mouse was first clicked. Using this point will ensure that dragging redraws</TD></TR><TR><TD CLASS="l">785</TD><TD> * are smooth.</TD></TR><TR><TD CLASS="l"><A NAME="32">786</A></TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">787</TD><TD> * @param newDraggingAnchor Point</TD></TR><TR><TD CLASS="l">788</TD><TD> */</TD></TR><TR><TD CLASS="l">789</TD><TD>protected void setDraggingAnchor(Point newDraggingAnchor) {</TD></TR><TR CLASS="c"><TD CLASS="l">790</TD><TD>        draggingAnchor = newDraggingAnchor;</TD></TR><TR CLASS="c"><TD CLASS="l">791</TD><TD>}</TD></TR><TR><TD CLASS="l">792</TD><TD>/**</TD></TR><TR><TD CLASS="l">793</TD><TD> * Sets the source widget from which a drag originated.</TD></TR><TR><TD CLASS="l">794</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">795</TD><TD> * Note: dragSource must be manually set by the controller of the widget since there is</TD></TR><TR><TD CLASS="l">796</TD><TD> * no obvious way for the container to know the object for which the drag originates.</TD></TR><TR><TD CLASS="l">797</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">798</TD><TD> * Passing in null simply means that the drag is released.</TD></TR><TR><TD CLASS="l">799</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l"><A NAME="20">800</A></TD><TD> * @param newDragSource ks.common.view.Widget</TD></TR><TR><TD CLASS="l">801</TD><TD> * @since v1.6</TD></TR><TR><TD CLASS="l">802</TD><TD> */</TD></TR><TR><TD CLASS="l">803</TD><TD>public void setDragSource(Widget newDragSource) {</TD></TR><TR CLASS="c"><TD CLASS="l">804</TD><TD>        if (newDragSource == null)</TD></TR><TR CLASS="z"><TD CLASS="l">805</TD><TD>                releaseDraggingObject();</TD></TR><TR><TD CLASS="l">806</TD><TD>        else                </TD></TR><TR CLASS="c"><TD CLASS="l">807</TD><TD>                dragSource = newDragSource;</TD></TR><TR CLASS="c"><TD CLASS="l">808</TD><TD>}</TD></TR><TR><TD CLASS="l">809</TD><TD> </TD></TR><TR><TD CLASS="l">810</TD><TD> </TD></TR><TR><TD CLASS="l">811</TD><TD>/**</TD></TR><TR><TD CLASS="l"><A NAME="1b">812</A></TD><TD> * Tell container of last drag point (or null if ending a drag).</TD></TR><TR><TD CLASS="l">813</TD><TD> * @param p java.awt.Point</TD></TR><TR><TD CLASS="l">814</TD><TD> */</TD></TR><TR><TD CLASS="l">815</TD><TD>public void setLastDrag(Point p) {</TD></TR><TR CLASS="z"><TD CLASS="l">816</TD><TD>        lastDrag = p;</TD></TR><TR CLASS="z"><TD CLASS="l">817</TD><TD>        dragging = (p != null);</TD></TR><TR CLASS="z"><TD CLASS="l">818</TD><TD>}</TD></TR><TR><TD CLASS="l">819</TD><TD>/**</TD></TR><TR><TD CLASS="l"><A NAME="33">820</A></TD><TD> * Alters the way in which this Container reacts to MouseEvents.</TD></TR><TR><TD CLASS="l">821</TD><TD> * @param ma java.awt.event.MouseAdapter</TD></TR><TR><TD CLASS="l">822</TD><TD> */</TD></TR><TR><TD CLASS="l">823</TD><TD>public void setMouseAdapter(java.awt.event.MouseAdapter ma) {</TD></TR><TR CLASS="c"><TD CLASS="l">824</TD><TD>        if (mouseManager != null)</TD></TR><TR CLASS="c"><TD CLASS="l">825</TD><TD>                mouseManager.setMouseAdapter (ma);</TD></TR><TR CLASS="c"><TD CLASS="l">826</TD><TD>}</TD></TR><TR><TD CLASS="l">827</TD><TD>/**</TD></TR><TR><TD CLASS="l"><A NAME="34">828</A></TD><TD> * Alters the way in which this Container reacts to MouseMotion events.</TD></TR><TR><TD CLASS="l">829</TD><TD> * @param ma java.awt.event.MouseMotionAdapter</TD></TR><TR><TD CLASS="l">830</TD><TD> */</TD></TR><TR><TD CLASS="l">831</TD><TD>public void setMouseMotionAdapter(java.awt.event.MouseMotionAdapter ma) {</TD></TR><TR CLASS="c"><TD CLASS="l">832</TD><TD>        if (mouseManager != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">833</TD><TD>                mouseManager.setMouseMotionAdapter (ma);</TD></TR><TR><TD CLASS="l">834</TD><TD>        }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="36">835</A></TD><TD>}</TD></TR><TR><TD CLASS="l">836</TD><TD> </TD></TR><TR><TD CLASS="l">837</TD><TD>/** Determine who must know of events. */</TD></TR><TR><TD CLASS="l">838</TD><TD>public void setUpdateStatus(IUpdateStatus ius) {</TD></TR><TR CLASS="c"><TD CLASS="l">839</TD><TD>        status = ius;</TD></TR><TR CLASS="c"><TD CLASS="l">840</TD><TD>}</TD></TR><TR><TD CLASS="l">841</TD><TD> </TD></TR><TR><TD CLASS="l">842</TD><TD> </TD></TR><TR><TD CLASS="l">843</TD><TD>/**</TD></TR><TR><TD CLASS="l"><A NAME="35">844</A></TD><TD> * Alters the way in which this Container reacts to UndoRequested</TD></TR><TR><TD CLASS="l">845</TD><TD> * @param ua UndoAdapter</TD></TR><TR><TD CLASS="l">846</TD><TD> */</TD></TR><TR><TD CLASS="l">847</TD><TD>public void setUndoAdapter(UndoAdapter ua) {</TD></TR><TR CLASS="c"><TD CLASS="l">848</TD><TD>        if (mouseManager != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">849</TD><TD>                mouseManager.setUndoAdapter (ua);</TD></TR><TR><TD CLASS="l">850</TD><TD>        }</TD></TR><TR CLASS="c"><TD CLASS="l">851</TD><TD>}</TD></TR><TR><TD CLASS="l">852</TD><TD>/**</TD></TR><TR><TD CLASS="l"><A NAME="1f">853</A></TD><TD> * Sets the entity responsible for updating background skin of the container</TD></TR><TR><TD CLASS="l">854</TD><TD> * @param v     the RectangleHierarchyVisitor to be used.</TD></TR><TR><TD CLASS="l">855</TD><TD> */</TD></TR><TR><TD CLASS="l">856</TD><TD>public void setVisitor(RectangleHierarchyVisitor v) {</TD></TR><TR CLASS="c"><TD CLASS="l">857</TD><TD>        if (v == null)</TD></TR><TR CLASS="z"><TD CLASS="l">858</TD><TD>                throw new IllegalArgumentException (&#34;Container::setImageDisplayer() received null argument.&#34;);</TD></TR><TR><TD CLASS="l">859</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">860</TD><TD>        visitor = v;</TD></TR><TR CLASS="c"><TD CLASS="l">861</TD><TD>}</TD></TR><TR><TD CLASS="l">862</TD><TD>/**</TD></TR><TR><TD CLASS="l"><A NAME="1d">863</A></TD><TD> * The game has been won. Move on to the next game.</TD></TR><TR><TD CLASS="l">864</TD><TD> */</TD></TR><TR><TD CLASS="l">865</TD><TD>public void wonGame() {</TD></TR><TR><TD CLASS="l">866</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">867</TD><TD>        if (game != null)</TD></TR><TR CLASS="z"><TD CLASS="l">868</TD><TD>                game.nextHand();</TD></TR><TR><TD CLASS="l">869</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">870</TD><TD>        resetSecurity();</TD></TR><TR CLASS="z"><TD CLASS="l">871</TD><TD>}</TD></TR><TR><TD CLASS="l">872</TD><TD> </TD></TR><TR><TD CLASS="l">873</TD><TD>/**</TD></TR><TR><TD CLASS="l">874</TD><TD> * Return the Model elements associated with the container's game as an Enumeration.</TD></TR><TR><TD CLASS="l">875</TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">876</TD><TD> * This method is not used during play. It is being provided to anticipate the need of</TD></TR><TR><TD CLASS="l">877</TD><TD> * a sophisticated Beta-testing GUI application that can inspect and manipulate the</TD></TR><TR><TD CLASS="l"><A NAME="c">878</A></TD><TD> * state of a solitaire plug-in.</TD></TR><TR><TD CLASS="l">879</TD><TD> * @return java.util.Enumeration</TD></TR><TR><TD CLASS="l">880</TD><TD> */</TD></TR><TR><TD CLASS="l">881</TD><TD>public java.util.Enumeration&lt;Element&gt; getModelElements() {</TD></TR><TR CLASS="z"><TD CLASS="l">882</TD><TD>        if (game == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">883</TD><TD>                return new java.util.Vector&lt;Element&gt;().elements();</TD></TR><TR><TD CLASS="l">884</TD><TD>        }</TD></TR><TR><TD CLASS="l">885</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">886</TD><TD>        return game.getModelElements();</TD></TR><TR><TD CLASS="l"><A NAME="a">887</A></TD><TD>}</TD></TR><TR><TD CLASS="l">888</TD><TD> </TD></TR><TR><TD CLASS="l">889</TD><TD>/** Need to access internal game to be able to find score, etc... */</TD></TR><TR><TD CLASS="l">890</TD><TD>public Solitaire getGame() {</TD></TR><TR CLASS="z"><TD CLASS="l">891</TD><TD>        return game;</TD></TR><TR><TD CLASS="l">892</TD><TD>}</TD></TR><TR><TD CLASS="l">893</TD><TD> </TD></TR><TR><TD CLASS="l">894</TD><TD>/**</TD></TR><TR><TD CLASS="l">895</TD><TD> * Return the card images associated with this container.</TD></TR><TR><TD CLASS="l"><A NAME="26">896</A></TD><TD> * &lt;p&gt;</TD></TR><TR><TD CLASS="l">897</TD><TD> * @return CardImages   the cardImages used by the plugin active within this container.</TD></TR><TR><TD CLASS="l">898</TD><TD> */</TD></TR><TR><TD CLASS="l">899</TD><TD>public CardImages getCardImages () {</TD></TR><TR CLASS="c"><TD CLASS="l">900</TD><TD>        return cards;</TD></TR><TR><TD CLASS="l"><A NAME="1c">901</A></TD><TD>}</TD></TR><TR><TD CLASS="l">902</TD><TD> </TD></TR><TR><TD CLASS="l">903</TD><TD>// When score is updated, worth knowing about...</TD></TR><TR><TD CLASS="l">904</TD><TD>public void updateScore(int sc) {</TD></TR><TR CLASS="z"><TD CLASS="l">905</TD><TD>        if (status != null) { status.updateScore(sc); }                </TD></TR><TR CLASS="z"><TD CLASS="l">906</TD><TD>}</TD></TR><TR><TD CLASS="l">907</TD><TD> </TD></TR><TR><TD CLASS="l">908</TD><TD> </TD></TR><TR><TD CLASS="l">909</TD><TD>}</TD></TR></TABLE><P></P><TABLE CLASS="hdft" CELLSPACING="0" WIDTH="100%"><TR><TD CLASS="nv">[<A HREF="../Framework-12-17.html">all classes</A>][<A HREF="36.html">ks.common.view</A>]</TD></TR><TR><TD CLASS="tl"><A HREF="http://www.eclemma.org/support.html">EMMA 2.0.5312 EclEmma Fix 1</A> (C) Vladimir Roubtsov</TD></TR></TABLE></BODY></HTML>